"""
Python基础学习 - argparse示例代码
=============================

本文件展示了如何使用argparse模块创建命令行工具。
argparse是Python标准库中用于命令行解析的模块，
它可以帮助我们轻松地创建用户友好的命令行界面。
"""

import argparse
import logging
from datetime import datetime

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)


class AccountBook:
    """简单的记账本类 - 演示如何使用类组织代码"""
    
    def __init__(self):
        """初始化记账本对象
        
        初始化一个空的记录列表，用于存储记账记录。
        """
        # records列表用于存储所有的记账记录
        self.records = []
    
    def add_record(self, amount, description):
        """添加记账记录
        
        将新的记账记录添加到记录列表中，并记录日志。
        
        Args:
            amount (float): 金额，可以是正数（收入）或负数（支出）
            description (str): 说明，对这笔账目的文字描述
        """
        # 创建记录字典，包含时间、金额和说明
        record = {
            'time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),  # 当前时间
            'amount': amount,      # 金额
            'description': description  # 说明
        }
        # 将记录添加到记录列表中
        self.records.append(record)
        # 使用logger记录INFO级别的日志
        logger.info(f"添加记录: {amount}元, 说明: {description}")
    
    def show_records(self):
        """显示所有记录
        
        遍历所有记账记录并打印到控制台，同时计算并显示总金额。
        如果没有记录，则显示提示信息。
        """
        # 检查是否有记录
        if not self.records:
            print("暂无记录")
            return
        
        print("\n记账记录:")
        total = 0  # 初始化总金额
        # 遍历所有记录并打印
        for record in self.records:
            print(f"{record['time']} - {record['amount']}元 - {record['description']}")
            total += record['amount']  # 累加总金额
        print(f"\n总计: {total}元")
        # 记录显示记录的日志
        logger.info(f"显示了{len(self.records)}条记录，总计{total}元")
    
    def save_to_file(self, filename):
        """保存记录到文件
        
        将所有记账记录保存到指定的CSV文件中，每行包含时间、金额和说明。
        使用with语句确保文件正确关闭，即使出现异常也能安全处理。
        
        Args:
            filename (str): 要保存的文件名，建议使用.csv扩展名
        """
        try:
            # 使用with语句安全地打开和关闭文件
            # 'w'模式表示写入模式，encoding='utf-8'指定文件编码
            with open(filename, 'w', encoding='utf-8') as f:
                # 遍历所有记录，将每条记录写入文件
                for record in self.records:
                    # 将记录的各个字段用逗号分隔后写入文件
                    f.write(f"{record['time']},{record['amount']},{record['description']}\n")
            # 记录保存成功的日志
            logger.info(f"记录已保存到{filename}")
            print(f"记录已保存到{filename}")
        except Exception as e:
            # 捕获并处理文件保存过程中可能出现的异常
            logger.error(f"保存文件时出错: {e}")
            print(f"保存文件时出错: {e}")


def create_account_book_cli():
    """创建记账本命令行工具 - 演示argparse的使用
    
    通过argparse模块创建一个命令行界面，用户可以通过命令行参数
    来操作记账本，包括添加记录、显示记录和保存记录到文件。
    """
    # 创建ArgumentParser对象，description参数用于生成帮助信息
    parser = argparse.ArgumentParser(description='简单的记账本命令行工具')
    
    # 添加命令行参数
    # --add参数用于添加记账记录，nargs=2表示需要2个值
    # metavar用于在帮助信息中显示参数名称
    parser.add_argument('--add', nargs=2, metavar=('金额', '说明'), 
                        help='添加记账记录，格式：金额 说明')
    # --show参数用于显示所有记录，action='store_true'表示该参数不带值，存在时为True
    parser.add_argument('--show', action='store_true', 
                        help='显示所有记账记录')
    # --save参数用于保存记录到文件
    parser.add_argument('--save', metavar='文件名', 
                        help='将记录保存到指定文件')
    
    # 创建记账本对象
    account_book = AccountBook()
    
    print("=== argparse示例 - 记账本命令行工具 ===")
    
    # 演示添加记录
    # parse_args方法解析命令行参数
    args = parser.parse_args(['--add', '50', '午餐'])
    if args.add:
        # 解包参数值
        amount, description = args.add
        # 调用add_record方法添加记录
        account_book.add_record(float(amount), description)
    
    # 演示添加另一条记录
    args = parser.parse_args(['--add', '30', '交通费'])
    if args.add:
        amount, description = args.add
        account_book.add_record(float(amount), description)
    
    # 演示显示记录
    args = parser.parse_args(['--show'])
    if args.show:
        account_book.show_records()
    
    # 演示保存到文件
    args = parser.parse_args(['--save', 'account_book.csv'])
    if args.save:
        account_book.save_to_file(args.save)
    
    # 清理测试文件
    # import os
    # if os.path.exists('account_book.csv'):
    #     os.remove('account_book.csv')
    #     print("已删除测试文件account_book.csv")


def argparse_demo():
    """argparse示例主函数"""
    create_account_book_cli()


if __name__ == "__main__":
    argparse_demo()